package com.spa.config;

import cn.dev33.satoken.config.SaTokenConfig;
import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.reactor.filter.SaReactorFilter;
import cn.dev33.satoken.router.SaHttpMethod;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

/**
 * 注册 Sa-Token全局过滤器
 * 
 * @author Administrator
 *
 */
@Configuration
public class SaTokenConfigure {

	@Bean
	public SaReactorFilter getSaServletFilter() {
		return new SaReactorFilter()
				// 拦截地址
				.addInclude("/**")
				// 开放地址
				.addExclude("/favicon.ico")
				// 鉴权方法：每次访问进入
				.setAuth(obj -> {
					// 登录校验 -- 拦截所有路由，并排除/user/doLogin 用于开放登录
//              SaRouter.match("/**", "/account-service/account/userLogin", r -> StpUtil.checkLogin());
					SaRouter.match("/**")
							.notMatch("/admin/account/userLogin",
									"/**/swagger-resources/**", "/**/webjars/**", "/**/v2/**", "/**/swagger-ui.html/**",
									"/**/doc.html/**", "/**/error", "/**/favicon.ico")
							.check(r -> StpUtil.checkLogin());

					// 权限认证 -- 不同模块, 校验不同权限
//					SaRouter.match("/user/**", r -> StpUtil.checkPermission("user"));
//					SaRouter.match("/admin/**", r -> StpUtil.checkPermission("admin"));
//					SaRouter.match("/goods/**", r -> StpUtil.checkPermission("goods"));
//					SaRouter.match("/orders/**", r -> StpUtil.checkPermission("orders"));

					// ...
				})
				// 异常处理方法：每次setAuth函数出现异常时进入
				.setError(e -> SaResult.error(e.getMessage()))

				.setBeforeAuth(obj -> {
					// ---------- 设置跨域响应头 ----------
					SaHolder.getResponse()
							// 允许指定域访问跨域资源
							.setHeader("Access-Control-Allow-Origin", "*")
							// 允许所有请求方式
							.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE")
							// 有效时间
							.setHeader("Access-Control-Max-Age", "3600")
							// 允许的header参数
							.setHeader("Access-Control-Allow-Headers", "*");

					// 如果是预检请求，则立即返回到前端
					SaRouter.match(SaHttpMethod.OPTIONS).free(r -> System.out.println("--------OPTIONS预检请求，不做处理"))
							.back();
				});
	}

}
